#include <stdio.h>
#include <string.h>
#define MaxSize 100

typedef struct
{
	char data[MaxSize]; // 用于存放整个IP地址
	int length; // IP地址字符串长度，方便输出
}IP;

void addch(IP &ip, char ch) // 往ip中加入字符ch
{
	ip.data[ip.length++] = ch;
}

IP adddot(IP ip) // 往ip中加入每个子串后的'.'，返回一个ip
{
	addch(ip,'.');
	return ip;
}

void getip(char s[], int n, int start, int no, IP ip) 
// n为字符串s长度，start是初始扫描位置，no是扫描的第几个子串
{	
	if(start == n && no == 4) // 递归出口：已经对这11个字符全部处理问题,因为no是从0开始，所以no==4时已经有四个子串了
	{
		for(int i=0;i<ip.length-1;i++) // i<ip.length-1是为了不输出最后的'.'
			printf("%c",ip.data[i]);
		printf("\n");
	}
	
	int num=0; // 用于记录当前子串的大小，判断其是否大于0且小于255
	for(int i=start;i<n&&i<start+3;i++) // 这里的i是扫描到了哪个位置 
	// 往往递归算法都会配套一个循环结构，为了找出所有情况 
	{
		num = 10*num + (s[i]-'0'); // 这是将字符串转换为整型数值的常用计算公式
		if(num >0 && num<=255)
		{
			addch(ip,s[i]);
			getip(s,n,i+1,no+1,adddot(ip)); // 扫描位置加1，扫描的字符串个数加1 
		}
		if(num == 0) break; // 不能出现0在开头的情况
	}
}

int main()
{
	char s[MaxSize];
	
	scanf("%s",s);
	
	int n = strlen(s); 
	
	IP ip;
	ip.length = 0;
	
	getip(s,n,0,0,ip);
	
	return 1;
}
